import axios from 'axios';
import FormUtils from '../utils/FormUtils';
import ReturnResult from '../utils/ReturnResult';

/**
 * 用户相关服务
 */
class UserService {

    /**
     * 获取登录用户信息
     * @returns {Promise<User>} 登录用户信息
     */
    async getLoginUser() {
        try {
            const resp = await axios.get('/user/login');
            return resp.data;
        } catch (err) {
            console.error(err);
        }
        return null;
    }

    /**
     * 登录
     * @param {{
     *      username: string,
     *      password: string,
     *      confirmPassword: string,
     *      email: string,
     *      captcha: string
     * }} data 表单数据
     * @returns {Promise<ReturnResult>} 登录结果
     */
    async login(data) {
        // 校验表单数据
        const result = this.validate(data, true);
        if (result.isFail) return result;

        // 发起登录请求
        try {
            const resp = await axios.post('/user/login', data);
            return ReturnResult.from(resp.data);
        } catch (err) {
            console.error(err);
        }
        return ReturnResult.fail('登录失败');
    }

    /**
     * 注册
     * @param {{
     *      username: string,
     *      password: string,
     *      confirmPassword: string,
     *      email: string,
     *      captcha: string
     * }} data 表单数据
     * @returns {Promise<ReturnResult>} 登录结果
     */
    async register(data) {
        // 校验表单数据
        const result = this.validate(data, false);
        if (result.isFail) return result;

        // 发起注册请求
        try {
            const resp = await axios.post('/user/register', data);
            return ReturnResult.from(resp.data);
        } catch (err) {
            console.error(err);
        }
        return ReturnResult.fail('注册失败');
    }

    /**
     * 退出登录
     */
    logout() {
        axios.get('/user/logout')
            .catch(err => console.error(err));
    }

    /**
     * 修改用户数据
     * @param {Object} newUser 新的用户数据
     * @param {boolean} isUpdatePassword 是否修改密码
     * @returns {Promise<ReturnResult>} 修改结果
     */ 
    async updateUser(newUser, isUpdatePassword) {
        // 校验表单数据
        const result = this.validateUserUpdateFormData(newUser, isUpdatePassword);
        if (result.isFail) return result;

        // 如果不修改密码，则请求不携带密码参数
        if (!isUpdatePassword) {
            delete newUser.password;
        }
        
        // 发起请求修改密码
        try {
            const resp = await axios.put('/user', newUser);
            return ReturnResult.from(resp.data);
        } catch (err) {
            console.error(err);
        }
        return ReturnResult.fail('修改失败');
    }

    /**
     * 获取用户列表
     * @returns {Promise<User[]>} 用户列表
     */
    async getUserList() {
        try {
            const resp = await axios.get('/user/list');
            return resp.data;
        } catch (err) {
            console.error(err);
        }
        return [];
    }

    /**
     * 根据id获取用户信息
     * @param {string|number} id 用户id
     * @returns {User} 用户信息
     */
    async getUserById(id) {
        try {
            const resp = await axios.get('/user/' + id);
            return resp.data;
        } catch (err) {
            console.error(err);
        }
        return null;
    }

    /**
     * 删除用户
     * @param {string|number} id 用户id
     * @returns {ReturnResult} 删除结果
     */
    async deleteUser(id) {
        try {
            const resp = await axios.delete('/user/' + id);
            return ReturnResult.from(resp.data);
        } catch (err) {
            console.error(err);
        }
        return ReturnResult.fail('删除失败');
    }

    /**
     * 校验表单数据
     * @param {{
     *  username: string,
     *  password: string,
     *  confirmPassword: string,
     *  email: string,
     *  captcha: string
     * }} data 表单数据
     * @param {boolean} isLogin 是否是登录表单
     */
    validate(data, isLogin) {
        // 校验用户名
        let result = FormUtils.validateUsername(data.username);
        if (!result.validated) return ReturnResult.fail(result.message);

        // 校验密码
        result = FormUtils.validatePassword(data.password);
        if (!result.validated) return ReturnResult.fail(result.message);

        // 根据表单功能类型判断是否继续校验
        if (isLogin) return ReturnResult.success();

        // 校验确认密码
        result = FormUtils.validatePassword(data.confirmPassword);
        if (!result.validated) return ReturnResult.fail('确认' + result.message);
        
        // 比较密码
        if (data.password !== data.confirmPassword) {
            return ReturnResult.fail('两次输入的密码不一样');
        }

        // 校验邮箱
        result = FormUtils.validateEmail(data.email);
        if (!result.validated) return ReturnResult.fail(result.message);

        // 校验验证码
        result = FormUtils.validateCaptcha(data.captcha);
        if (!result.validated) return ReturnResult.fail(result.message);

        return ReturnResult.success();
    }

    /**
     * 校验修改用户信息的表单数
     * @param {{
     *      username: string,
     *      email: string,
     *      password?: string
     * }} data 表单数据
     * @param {boolean} isUpdatePassword 是否修改密码
     * @returns 校验结果
     */
    validateUserUpdateFormData(data, isUpdatePassword) {
        // 校验用户名
        let result = FormUtils.validateUsername(data.username);
        if (!result.validated) return ReturnResult.fail(result.message);

        // 校验邮箱
        result = FormUtils.validateEmail(data.email);
        if (!result.validated) return ReturnResult.fail(result.message);

        // 校验密码
        if (isUpdatePassword) {
            result = FormUtils.validatePassword(data.password);
            if (!result.validated) return ReturnResult.fail(result.message);
        }
        return ReturnResult.success();;
    }

    /**
     * 比较两个用户的数据是否一样
     */
    equalsUser(user1, user2) {
        return (
            user1.username === user2.username 
            && user1.age === user2.age
            && user1.gender === user2.gender
            && user1.email === user2.email
        );
    }
}

export default new UserService();;